package sdk
import (
"bytes"
"encoding/json"
"errors"
"fmt"
)
const (
CustomType panelType = iota
DashlistType
GraphType
TableType
TextType
PluginlistType
AlertlistType
SinglestatType
StatType
RowType
BarGaugeType
HeatmapType
TimeseriesType
LogsType
GaugeType
)
const MixedSource = "-- Mixed --"
type RepeatDirection string
const (
RepeatDirectionVertical RepeatDirection = "v"
RepeatDirectionHorizontal RepeatDirection = "h"
)
type (
Panel struct {
CommonPanel
*GraphPanel
*TablePanel
*TextPanel
*SinglestatPanel
*StatPanel
*DashlistPanel
*PluginlistPanel
*RowPanel
*AlertlistPanel
*BarGaugePanel
*HeatmapPanel
*TimeseriesPanel
*LogsPanel
*GaugePanel
*CustomPanel
}
panelType int8
CommonPanel struct {
Datasource *DatasourceRef `json:"datasource,omitempty"`
Editable bool `json:"editable"`
Error bool `json:"error"`
GridPos struct {
H *int `json:"h,omitempty"`
W *int `json:"w,omitempty"`
X *int `json:"x,omitempty"`
Y *int `json:"y,omitempty"`
} `json:"gridPos,omitempty"`
Height interface {} `json:"height,omitempty"`
HideTimeOverride *bool `json:"hideTimeOverride,omitempty"`
ID uint `json:"id"`
IsNew bool `json:"isNew"`
Links []Link `json:"links,omitempty"`
MinSpan *float32 `json:"minSpan,omitempty"`
OfType panelType `json:"-"`
Renderer *string `json:"renderer,omitempty"`
Repeat *string `json:"repeat,omitempty"`
RepeatDirection *RepeatDirection `json:"repeatDirection,omitempty"`
RepeatPanelID *uint `json:"repeatPanelId,omitempty"`
ScopedVars map [string ]struct {
Selected bool `json:"selected"`
Text string `json:"text"`
Value string `json:"value"`
} `json:"scopedVars,omitempty"`
Span float32 `json:"span"`
Title string `json:"title"`
Description *string `json:"description,omitempty"`
Transparent bool `json:"transparent"`
Type string `json:"type"`
}
GraphPanel struct {
AliasColors interface {} `json:"aliasColors"`
Bars bool `json:"bars"`
DashLength *uint `json:"dashLength,omitempty"`
Dashes *bool `json:"dashes,omitempty"`
Decimals *int `json:"decimals,omitempty"`
Fill int `json:"fill"`
Legend Legend `json:"legend,omitempty"`
LeftYAxisLabel *string `json:"leftYAxisLabel,omitempty"`
Lines bool `json:"lines"`
Linewidth uint `json:"linewidth"`
NullPointMode string `json:"nullPointMode"`
Percentage bool `json:"percentage"`
Pointradius float32 `json:"pointradius"`
Points bool `json:"points"`
RightYAxisLabel *string `json:"rightYAxisLabel,omitempty"`
SeriesOverrides []SeriesOverride `json:"seriesOverrides,omitempty"`
SpaceLength *uint `json:"spaceLength,omitempty"`
Stack bool `json:"stack"`
SteppedLine bool `json:"steppedLine"`
Targets []Target `json:"targets,omitempty"`
Thresholds []Threshold `json:"thresholds,omitempty"`
TimeFrom *string `json:"timeFrom,omitempty"`
TimeShift *string `json:"timeShift,omitempty"`
Tooltip Tooltip `json:"tooltip"`
XAxis bool `json:"x-axis,omitempty"`
YAxis bool `json:"y-axis,omitempty"`
YFormats []string `json:"y_formats,omitempty"`
Xaxis Axis `json:"xaxis"`
Yaxes []Axis `json:"yaxes"`
FieldConfig *FieldConfig `json:"fieldConfig,omitempty"`
}
FieldConfig struct {
Defaults FieldConfigDefaults `json:"defaults"`
Overrides []FieldConfigOverride `json:"overrides"`
}
Options struct {
Orientation string `json:"orientation"`
TextMode string `json:"textMode"`
ColorMode string `json:"colorMode"`
GraphMode string `json:"graphMode"`
JustifyMode string `json:"justifyMode"`
DisplayMode string `json:"displayMode"`
Content string `json:"content"`
Mode string `json:"mode"`
ReduceOptions ReduceOptions `json:"reduceOptions"`
Text *TextOptions `json:"text,omitempty"`
}
TextOptions struct {
ValueSize int `json:"valueSize,omitempty"`
TitleSize int `json:"titleSize,omitempty"`
}
ReduceOptions struct {
Values bool `json:"values"`
Fields string `json:"fields"`
Calcs []string `json:"calcs"`
}
Threshold struct {
Value float32 `json:"value"`
ColorMode string `json:"colorMode,omitempty"`
Op string `json:"op,omitempty"`
Fill bool `json:"fill"`
Line bool `json:"line"`
FillColor string `json:"fillColor,omitempty"`
LineColor string `json:"lineColor,omitempty"`
Yaxis string `json:"yaxis,omitempty"`
}
Tooltip struct {
Shared bool `json:"shared"`
ValueType string `json:"value_type"`
MsResolution bool `json:"msResolution,omitempty"`
Sort int `json:"sort,omitempty"`
}
TablePanel struct {
Columns []Column `json:"columns"`
Sort *Sort `json:"sort,omitempty"`
Styles []ColumnStyle `json:"styles"`
Transform string `json:"transform"`
Targets []Target `json:"targets,omitempty"`
Scroll bool `json:"scroll"`
}
TextPanel struct {
Content string `json:"content"`
Mode string `json:"mode"`
PageSize uint `json:"pageSize"`
Scroll bool `json:"scroll"`
ShowHeader bool `json:"showHeader"`
Sort Sort `json:"sort"`
Styles []ColumnStyle `json:"styles"`
FieldConfig FieldConfig `json:"fieldConfig"`
Options struct {
Content string `json:"content"`
Mode string `json:"mode"`
} `json:"options"`
}
SinglestatPanel struct {
Colors []string `json:"colors"`
ColorValue bool `json:"colorValue"`
ColorBackground bool `json:"colorBackground"`
Decimals int `json:"decimals"`
Format string `json:"format"`
Gauge Gauge `json:"gauge,omitempty"`
MappingType *uint `json:"mappingType,omitempty"`
MappingTypes []*MapType `json:"mappingTypes,omitempty"`
MaxDataPoints *IntString `json:"maxDataPoints,omitempty"`
NullPointMode string `json:"nullPointMode"`
Postfix *string `json:"postfix,omitempty"`
PostfixFontSize *string `json:"postfixFontSize,omitempty"`
Prefix *string `json:"prefix,omitempty"`
PrefixFontSize *string `json:"prefixFontSize,omitempty"`
RangeMaps []*RangeMap `json:"rangeMaps,omitempty"`
SparkLine SparkLine `json:"sparkline,omitempty"`
Targets []Target `json:"targets,omitempty"`
Thresholds string `json:"thresholds"`
ValueFontSize string `json:"valueFontSize"`
ValueMaps []ValueMap `json:"valueMaps"`
ValueName string `json:"valueName"`
}
StatPanel struct {
Targets []Target `json:"targets,omitempty"`
Options StatOptions `json:"options"`
FieldConfig FieldConfig `json:"fieldConfig"`
}
StatOptions struct {
Orientation string `json:"orientation"`
TextMode string `json:"textMode"`
ColorMode string `json:"colorMode"`
GraphMode string `json:"graphMode"`
JustifyMode string `json:"justifyMode"`
ReduceOptions ReduceOptions `json:"reduceOptions"`
Text *TextOptions `json:"text,omitempty"`
}
DashlistPanel struct {
Mode string `json:"mode"`
Query string `json:"query"`
Tags []string `json:"tags"`
FolderID int `json:"folderId"`
Limit int `json:"limit"`
Headings bool `json:"headings"`
Recent bool `json:"recent"`
Search bool `json:"search"`
Starred bool `json:"starred"`
}
PluginlistPanel struct {
Limit int `json:"limit,omitempty"`
}
AlertlistPanel struct {
OnlyAlertsOnDashboard bool `json:"onlyAlertsOnDashboard"`
Show string `json:"show"`
SortOrder int `json:"sortOrder"`
Limit int `json:"limit"`
StateFilter []string `json:"stateFilter"`
NameFilter string `json:"nameFilter,omitempty"`
DashboardTags []string `json:"dashboardTags,omitempty"`
}
BarGaugePanel struct {
Options Options `json:"options"`
Targets []Target `json:"targets,omitempty"`
FieldConfig FieldConfig `json:"fieldConfig"`
}
RowPanel struct {
Panels []Panel `json:"panels"`
Collapsed bool `json:"collapsed"`
}
HeatmapPanel struct {
Cards struct {
CardPadding *float64 `json:"cardPadding"`
CardRound *float64 `json:"cardRound"`
} `json:"cards"`
Color struct {
CardColor string `json:"cardColor"`
ColorScale string `json:"colorScale"`
ColorScheme string `json:"colorScheme"`
Exponent float64 `json:"exponent"`
Min *float64 `json:"min,omitempty"`
Max *float64 `json:"max,omitempty"`
Mode string `json:"mode"`
} `json:"color"`
DataFormat string `json:"dataFormat"`
HideZeroBuckets bool `json:"hideZeroBuckets"`
HighlightCards bool `json:"highlightCards"`
Legend struct {
Show bool `json:"show"`
} `json:"legend"`
ReverseYBuckets bool `json:"reverseYBuckets"`
Targets []Target `json:"targets,omitempty"`
Tooltip struct {
Show bool `json:"show"`
ShowHistogram bool `json:"showHistogram"`
} `json:"tooltip"`
TooltipDecimals int `json:"tooltipDecimals"`
XAxis struct {
Show bool `json:"show"`
} `json:"xAxis"`
XBucketNumber *float64 `json:"xBucketNumber"`
XBucketSize *string `json:"xBucketSize"`
YAxis struct {
Decimals *int `json:"decimals"`
Format string `json:"format"`
LogBase int `json:"logBase"`
Show bool `json:"show"`
Max *string `json:"max"`
Min *string `json:"min"`
SplitFactor *float64 `json:"splitFactor"`
} `json:"yAxis"`
YBucketBound string `json:"yBucketBound"`
YBucketNumber *float64 `json:"yBucketNumber"`
YBucketSize *float64 `json:"yBucketSize"`
}
TimeseriesPanel struct {
Targets []Target `json:"targets,omitempty"`
Options TimeseriesOptions `json:"options"`
FieldConfig FieldConfig `json:"fieldConfig"`
}
TimeseriesOptions struct {
Legend TimeseriesLegendOptions `json:"legend,omitempty"`
Tooltip TimeseriesTooltipOptions `json:"tooltip,omitempty"`
}
TimeseriesLegendOptions struct {
Calcs []string `json:"calcs"`
Show *bool `json:"showLegend,omitempty"`
DisplayMode string `json:"displayMode"`
Placement string `json:"placement"`
}
TimeseriesTooltipOptions struct {
Mode string `json:"mode"`
}
FieldConfigDefaults struct {
Unit string `json:"unit"`
NoValue string `json:"noValue,omitempty"`
Decimals *int `json:"decimals,omitempty"`
Min *float64 `json:"min,omitempty"`
Max *float64 `json:"max,omitempty"`
Color FieldConfigColor `json:"color"`
Thresholds Thresholds `json:"thresholds"`
Custom FieldConfigCustom `json:"custom"`
Links []Link `json:"links,omitempty"`
}
FieldConfigOverrideProperty struct {
ID string `json:"id"`
Value interface {} `json:"value"`
}
FieldConfigOverride struct {
Matcher struct {
ID string `json:"id"`
Options string `json:"options"`
} `json:"matcher"`
Properties []FieldConfigOverrideProperty `json:"properties"`
}
FieldConfigCustom struct {
AxisLabel string `json:"axisLabel,omitempty"`
AxisPlacement string `json:"axisPlacement"`
AxisSoftMin *int `json:"axisSoftMin,omitempty"`
AxisSoftMax *int `json:"axisSoftMax,omitempty"`
BarAlignment int `json:"barAlignment"`
DrawStyle string `json:"drawStyle"`
FillOpacity int `json:"fillOpacity"`
GradientMode string `json:"gradientMode"`
LineInterpolation string `json:"lineInterpolation"`
LineWidth int `json:"lineWidth"`
PointSize int `json:"pointSize"`
ShowPoints string `json:"showPoints"`
SpanNulls bool `json:"spanNulls"`
HideFrom struct {
Legend bool `json:"legend"`
Tooltip bool `json:"tooltip"`
Viz bool `json:"viz"`
} `json:"hideFrom"`
LineStyle struct {
Fill string `json:"fill"`
} `json:"lineStyle"`
ScaleDistribution struct {
Type string `json:"type"`
Log int `json:"log,omitempty"`
} `json:"scaleDistribution"`
Stacking struct {
Group string `json:"group"`
Mode string `json:"mode"`
} `json:"stacking"`
ThresholdsStyle struct {
Mode string `json:"mode"`
} `json:"thresholdsStyle"`
}
Thresholds struct {
Mode string `json:"mode"`
Steps []ThresholdStep `json:"steps"`
}
ThresholdStep struct {
Color string `json:"color"`
Value *float64 `json:"value"`
}
FieldConfigColor struct {
Mode string `json:"mode"`
FixedColor string `json:"fixedColor,omitempty"`
SeriesBy string `json:"seriesBy,omitempty"`
}
LogsPanel struct {
Targets []Target `json:"targets,omitempty"`
Options LogsOptions `json:"options,omitempty"`
}
LogsOptions struct {
DedupStrategy string `json:"dedupStrategy"`
WrapLogMessage bool `json:"wrapLogMessage"`
ShowTime bool `json:"showTime"`
ShowLabels bool `json:"showLabels"`
ShowCommonLabels bool `json:"showCommonLabels"`
PrettifyLogMessage bool `json:"prettifyLogMessage"`
SortOrder string `json:"sortOrder"`
EnableLogDetails bool `json:"enableLogDetails"`
}
GaugePanel struct {
Targets []Target `json:"targets,omitempty"`
Options StatOptions `json:"options"`
FieldConfig FieldConfig `json:"fieldConfig"`
}
CustomPanel map [string ]interface {}
)
type (
Axis struct {
Format string `json:"format"`
LogBase int `json:"logBase"`
Decimals int `json:"decimals,omitempty"`
Max *FloatString `json:"max,omitempty"`
Min *FloatString `json:"min,omitempty"`
Show bool `json:"show"`
Label string `json:"label,omitempty"`
}
SeriesOverride struct {
Alias string `json:"alias"`
Bars *bool `json:"bars,omitempty"`
Color *string `json:"color,omitempty"`
Dashes *bool `json:"dashes,omitempty"`
Fill *int `json:"fill,omitempty"`
FillBelowTo *string `json:"fillBelowTo,omitempty"`
Legend *bool `json:"legend,omitempty"`
Lines *bool `json:"lines,omitempty"`
LineWidth *int `json:"linewidth,omitempty"`
Stack *BoolString `json:"stack,omitempty"`
Transform *string `json:"transform,omitempty"`
YAxis *int `json:"yaxis,omitempty"`
ZIndex *int `json:"zindex,omitempty"`
NullPointMode *string `json:"nullPointMode,omitempty"`
}
Sort struct {
Col int `json:"col"`
Desc bool `json:"desc"`
}
Legend struct {
AlignAsTable bool `json:"alignAsTable"`
Avg bool `json:"avg"`
Current bool `json:"current"`
HideEmpty bool `json:"hideEmpty"`
HideZero bool `json:"hideZero"`
Max bool `json:"max"`
Min bool `json:"min"`
RightSide bool `json:"rightSide"`
Show bool `json:"show"`
SideWidth *uint `json:"sideWidth,omitempty"`
Total bool `json:"total"`
Values bool `json:"values"`
}
)
type (
Column struct {
TextType string `json:"text"`
Value string `json:"value"`
}
ColumnStyle struct {
Alias *string `json:"alias"`
DateFormat *string `json:"dateFormat,omitempty"`
Pattern string `json:"pattern"`
Type string `json:"type"`
ColorMode *string `json:"colorMode,omitempty"`
Colors *[]string `json:"colors,omitempty"`
Decimals *int `json:"decimals,omitempty"`
Thresholds *[]string `json:"thresholds,omitempty"`
Unit *string `json:"unit,omitempty"`
MappingType int `json:"mappingType,omitempty"`
ValueMaps []ValueMap `json:"valueMaps,omitempty"`
Link bool `json:"link,omitempty"`
LinkTooltip *string `json:"linkTooltip,omitempty"`
LinkUrl *string `json:"linkUrl,omitempty"`
LinkTargetBlank bool `json:"linkTargetBlank,omitempty"`
}
)
type (
ValueMap struct {
Op string `json:"op"`
TextType string `json:"text"`
Value string `json:"value"`
}
Gauge struct {
MaxValue float32 `json:"maxValue"`
MinValue float32 `json:"minValue"`
Show bool `json:"show"`
ThresholdLabels bool `json:"thresholdLabels"`
ThresholdMarkers bool `json:"thresholdMarkers"`
}
SparkLine struct {
FillColor *string `json:"fillColor,omitempty"`
Full bool `json:"full,omitempty"`
LineColor *string `json:"lineColor,omitempty"`
Show bool `json:"show,omitempty"`
YMin *float64 `json:"ymin,omitempty"`
YMax *float64 `json:"ymax,omitempty"`
}
)
type Target struct {
RefID string `json:"refId"`
Datasource *DatasourceRef `json:"datasource,omitempty"`
Hide bool `json:"hide,omitempty"`
Table string `json:"table,omitempty"`
TimeColumn string `json:"timeColumn,omitempty"`
MetricColumn string `json:"metricColumn,omitempty"`
RawSql string `json:"rawSql,omitempty"`
Select [][]struct {
Params []string `json:"params,omitempty"`
Type string `json:"type,omitempty"`
} `json:"select,omitempty"`
Where []struct {
Type string `json:"type,omitempty"`
Name string `json:"name,omitempty"`
Params []string `json:"params,omitempty"`
Datatype string `json:"datatype,omitempty"`
} `json:"where,omitempty"`
Group []struct {
Type string `json:"type,omitempty"`
Params []string `json:"params,omitempty"`
} `json:"group,omitempty"`
Expr string `json:"expr,omitempty"`
IntervalFactor int `json:"intervalFactor,omitempty"`
Interval string `json:"interval,omitempty"`
Step int `json:"step,omitempty"`
LegendFormat string `json:"legendFormat,omitempty"`
Instant bool `json:"instant,omitempty"`
Format string `json:"format,omitempty"`
Measurement string `json:"measurement,omitempty"`
DsType *string `json:"dsType,omitempty"`
Metrics []struct {
ID string `json:"id"`
Field string `json:"field"`
Type string `json:"type"`
} `json:"metrics,omitempty"`
Query string `json:"query,omitempty"`
Alias string `json:"alias,omitempty"`
RawQuery bool `json:"rawQuery,omitempty"`
TimeField string `json:"timeField,omitempty"`
BucketAggs []struct {
ID string `json:"id"`
Field string `json:"field"`
Type string `json:"type"`
Settings struct {
Interval string `json:"interval,omitempty"`
MinDocCount interface {} `json:"min_doc_count"`
Order string `json:"order,omitempty"`
OrderBy string `json:"orderBy,omitempty"`
Size string `json:"size,omitempty"`
} `json:"settings"`
} `json:"bucketAggs,omitempty"`
Target string `json:"target,omitempty"`
Namespace string `json:"namespace,omitempty"`
MetricName string `json:"metricName,omitempty"`
Statistics []string `json:"statistics,omitempty"`
Dimensions map [string ]string `json:"dimensions,omitempty"`
Period string `json:"period,omitempty"`
Region string `json:"region,omitempty"`
ProjectName string `json:"projectName,omitempty"`
AlignOptions []StackdriverAlignOptions `json:"alignOptions,omitempty"`
AliasBy string `json:"aliasBy,omitempty"`
MetricType string `json:"metricType,omitempty"`
MetricKind string `json:"metricKind,omitempty"`
Filters []string `json:"filters,omitempty"`
AlignmentPeriod string `json:"alignmentPeriod,omitempty"`
CrossSeriesReducer string `json:"crossSeriesReducer,omitempty"`
PerSeriesAligner string `json:"perSeriesAligner,omitempty"`
ValueType string `json:"valueType,omitempty"`
Preprocessor string `json:"preprocessor,omitempty"`
GroupBys []string `json:"groupBys,omitempty"`
Tags []struct {
Key string `json:"key,omitempty"`
Operator string `json:"operator,omitempty"`
Value string `json:"value,omitempty"`
} `json:"tags,omitempty"`
}
type StackdriverAlignOptions struct {
Expanded bool `json:"expanded"`
Label string `json:"label"`
Options []StackdriverAlignOption `json:"options"`
}
type StackdriverAlignOption struct {
Label string `json:"label"`
MetricKinds []string `json:"metricKinds"`
Text string `json:"text"`
Value string `json:"value"`
ValueTypes []string `json:"valueTypes"`
}
type MapType struct {
Name *string `json:"name,omitempty"`
Value *int `json:"value,omitempty"`
}
type RangeMap struct {
From *string `json:"from,omitempty"`
Text *string `json:"text,omitempty"`
To *string `json:"to,omitempty"`
}
func NewDashlist (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : DashlistType ,
Title : title ,
Type : "dashlist" ,
Renderer : &render ,
IsNew : true },
DashlistPanel : &DashlistPanel {}}
}
func NewGraph (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : GraphType ,
Title : title ,
Type : "graph" ,
Renderer : &render ,
Span : 12 ,
IsNew : true },
GraphPanel : &GraphPanel {
NullPointMode : "connected" ,
Pointradius : 5 ,
XAxis : true ,
YAxis : true ,
}}
}
func NewTimeseries (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
return &Panel {
CommonPanel : CommonPanel {
OfType : TimeseriesType ,
Title : title ,
Type : "timeseries" ,
Span : 12 ,
IsNew : true ,
},
TimeseriesPanel : &TimeseriesPanel {
FieldConfig : FieldConfig {
Defaults : FieldConfigDefaults {
Color : FieldConfigColor {
Mode : "palette-classic" ,
FixedColor : "green" ,
SeriesBy : "last" ,
},
},
},
},
}
}
func NewLogs (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
return &Panel {
CommonPanel : CommonPanel {
OfType : LogsType ,
Title : title ,
Type : "logs" ,
Span : 12 ,
IsNew : true ,
},
LogsPanel : &LogsPanel {},
}
}
func NewGauge (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
return &Panel {
CommonPanel : CommonPanel {
OfType : GaugeType ,
Title : title ,
Type : "gauge" ,
Span : 12 ,
IsNew : true ,
},
GaugePanel : &GaugePanel {
Options : StatOptions {
GraphMode : "none" ,
ReduceOptions : ReduceOptions {
Calcs : []string {"lastNotNull" },
},
Text : &TextOptions {},
},
FieldConfig : FieldConfig {
Defaults : FieldConfigDefaults {
Color : FieldConfigColor {
Mode : "thresholds" ,
FixedColor : "green" ,
SeriesBy : "last" ,
},
},
},
},
}
}
func NewTable (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : TableType ,
Title : title ,
Type : "table" ,
Renderer : &render ,
IsNew : true },
TablePanel : &TablePanel {}}
}
func NewText (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : TextType ,
Title : title ,
Type : "text" ,
Renderer : &render ,
IsNew : true },
TextPanel : &TextPanel {}}
}
func NewSinglestat (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : SinglestatType ,
Title : title ,
Type : "singlestat" ,
Renderer : &render ,
IsNew : true },
SinglestatPanel : &SinglestatPanel {}}
}
func NewStat (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : StatType ,
Title : title ,
Type : "stat" ,
Renderer : &render ,
IsNew : true ,
},
StatPanel : &StatPanel {
Options : StatOptions {
GraphMode : "none" ,
ReduceOptions : ReduceOptions {
Calcs : []string {"lastNotNull" },
},
Text : &TextOptions {},
},
FieldConfig : FieldConfig {
Defaults : FieldConfigDefaults {
Color : FieldConfigColor {
Mode : "thresholds" ,
FixedColor : "green" ,
SeriesBy : "last" ,
},
},
},
},
}
}
func NewPluginlist (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : PluginlistType ,
Title : title ,
Type : "pluginlist" ,
Renderer : &render ,
IsNew : true },
PluginlistPanel : &PluginlistPanel {}}
}
func NewAlertlist (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : AlertlistType ,
Title : title ,
Type : "alertlist" ,
Renderer : &render ,
IsNew : true },
AlertlistPanel : &AlertlistPanel {}}
}
func NewHeatmap (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : HeatmapType ,
Title : title ,
Type : "heatmap" ,
Renderer : &render ,
IsNew : true },
HeatmapPanel : &HeatmapPanel {}}
}
func NewCustom (title string ) *Panel {
if title == "" {
title = "Panel Title"
}
render := "flot"
return &Panel {
CommonPanel : CommonPanel {
OfType : CustomType ,
Title : title ,
Type : "singlestat" ,
Renderer : &render ,
IsNew : true },
CustomPanel : &CustomPanel {}}
}
func (p *Panel ) ResetTargets () {
switch p .OfType {
case GraphType :
p .GraphPanel .Targets = nil
case SinglestatType :
p .SinglestatPanel .Targets = nil
case StatType :
p .StatPanel .Targets = nil
case TableType :
p .TablePanel .Targets = nil
case BarGaugeType :
p .BarGaugePanel .Targets = nil
case HeatmapType :
p .HeatmapPanel .Targets = nil
case TimeseriesType :
p .TimeseriesPanel .Targets = nil
case LogsType :
p .LogsPanel .Targets = nil
case GaugeType :
p .GaugePanel .Targets = nil
}
}
func (p *Panel ) AddTarget (t *Target ) {
switch p .OfType {
case GraphType :
p .GraphPanel .Targets = append (p .GraphPanel .Targets , *t )
case SinglestatType :
p .SinglestatPanel .Targets = append (p .SinglestatPanel .Targets , *t )
case StatType :
p .StatPanel .Targets = append (p .StatPanel .Targets , *t )
case TableType :
p .TablePanel .Targets = append (p .TablePanel .Targets , *t )
case HeatmapType :
p .HeatmapPanel .Targets = append (p .HeatmapPanel .Targets , *t )
case TimeseriesType :
p .TimeseriesPanel .Targets = append (p .TimeseriesPanel .Targets , *t )
case LogsType :
p .LogsPanel .Targets = append (p .LogsPanel .Targets , *t )
case GaugeType :
p .GaugePanel .Targets = append (p .GaugePanel .Targets , *t )
}
}
func (p *Panel ) SetTarget (t *Target ) {
setTarget := func (t *Target , targets *[]Target ) {
for i , target := range *targets {
if t .RefID == target .RefID {
(*targets )[i ] = *t
return
}
}
(*targets ) = append ((*targets ), *t )
}
switch p .OfType {
case GraphType :
setTarget (t , &p .GraphPanel .Targets )
case SinglestatType :
setTarget (t , &p .SinglestatPanel .Targets )
case StatType :
setTarget (t , &p .StatPanel .Targets )
case TableType :
setTarget (t , &p .TablePanel .Targets )
case HeatmapType :
setTarget (t , &p .HeatmapPanel .Targets )
case TimeseriesType :
setTarget (t , &p .TimeseriesPanel .Targets )
case LogsType :
setTarget (t , &p .LogsPanel .Targets )
case GaugeType :
setTarget (t , &p .GaugePanel .Targets )
}
}
func (p *Panel ) RepeatDatasourcesForEachTarget (dsNames ...string ) {
repeatDS := func (dsNames []string , targets *[]Target ) {
var refID = "A"
originalTargets := *targets
cleanedTargets := make ([]Target , 0 , len (originalTargets )*len (dsNames ))
*targets = cleanedTargets
for _ , target := range originalTargets {
for _ , ds := range dsNames {
newTarget := target
newTarget .RefID = refID
newTarget .Datasource = &DatasourceRef {LegacyName : ds }
refID = incRefID (refID )
*targets = append (*targets , newTarget )
}
}
}
switch p .OfType {
case GraphType :
repeatDS (dsNames , &p .GraphPanel .Targets )
case SinglestatType :
repeatDS (dsNames , &p .SinglestatPanel .Targets )
case StatType :
repeatDS (dsNames , &p .StatPanel .Targets )
case TableType :
repeatDS (dsNames , &p .TablePanel .Targets )
case HeatmapType :
repeatDS (dsNames , &p .HeatmapPanel .Targets )
case TimeseriesType :
repeatDS (dsNames , &p .TimeseriesPanel .Targets )
case LogsType :
repeatDS (dsNames , &p .LogsPanel .Targets )
case GaugeType :
repeatDS (dsNames , &p .GaugePanel .Targets )
}
}
func (p *Panel ) RepeatTargetsForDatasources (dsNames ...string ) {
repeatTarget := func (dsNames []string , targets *[]Target ) {
var lastRefID string
lenTargets := len (*targets )
for i , name := range dsNames {
if i < lenTargets {
(*targets )[i ].Datasource = &DatasourceRef {LegacyName : name }
lastRefID = (*targets )[i ].RefID
} else {
newTarget := (*targets )[i %lenTargets ]
lastRefID = incRefID (lastRefID )
newTarget .RefID = lastRefID
newTarget .Datasource = &DatasourceRef {LegacyName : name }
*targets = append (*targets , newTarget )
}
}
}
switch p .OfType {
case GraphType :
repeatTarget (dsNames , &p .GraphPanel .Targets )
case SinglestatType :
repeatTarget (dsNames , &p .SinglestatPanel .Targets )
case StatType :
repeatTarget (dsNames , &p .StatPanel .Targets )
case TableType :
repeatTarget (dsNames , &p .TablePanel .Targets )
case HeatmapType :
repeatTarget (dsNames , &p .HeatmapPanel .Targets )
case TimeseriesType :
repeatTarget (dsNames , &p .TimeseriesPanel .Targets )
case LogsType :
repeatTarget (dsNames , &p .LogsPanel .Targets )
case GaugeType :
repeatTarget (dsNames , &p .GaugePanel .Targets )
}
}
func (p *Panel ) GetTargets () *[]Target {
switch p .OfType {
case GraphType :
return &p .GraphPanel .Targets
case SinglestatType :
return &p .SinglestatPanel .Targets
case StatType :
return &p .StatPanel .Targets
case TableType :
return &p .TablePanel .Targets
case BarGaugeType :
return &p .BarGaugePanel .Targets
case HeatmapType :
return &p .HeatmapPanel .Targets
case TimeseriesType :
return &p .TimeseriesPanel .Targets
case LogsType :
return &p .LogsPanel .Targets
case GaugeType :
return &p .GaugePanel .Targets
default :
return nil
}
}
type probePanel struct {
CommonPanel
}
func (p *Panel ) UnmarshalJSON (b []byte ) error {
var probe probePanel
var err error
if err = json .Unmarshal (b , &probe ); err != nil {
return err
}
p .CommonPanel = probe .CommonPanel
switch probe .Type {
case "graph" :
var graph GraphPanel
p .OfType = GraphType
if err = json .Unmarshal (b , &graph ); err == nil {
p .GraphPanel = &graph
}
case "table" :
var table TablePanel
p .OfType = TableType
if err = json .Unmarshal (b , &table ); err == nil {
p .TablePanel = &table
}
case "text" :
var text TextPanel
p .OfType = TextType
if err = json .Unmarshal (b , &text ); err == nil {
p .TextPanel = &text
}
case "singlestat" :
var singlestat SinglestatPanel
p .OfType = SinglestatType
if err = json .Unmarshal (b , &singlestat ); err == nil {
p .SinglestatPanel = &singlestat
}
case "stat" :
var stat StatPanel
p .OfType = StatType
if err = json .Unmarshal (b , &stat ); err == nil {
p .StatPanel = &stat
}
case "dashlist" :
var dashlist DashlistPanel
p .OfType = DashlistType
if err = json .Unmarshal (b , &dashlist ); err == nil {
p .DashlistPanel = &dashlist
}
case "bargauge" :
var bargauge BarGaugePanel
p .OfType = BarGaugeType
if err = json .Unmarshal (b , &bargauge ); err == nil {
p .BarGaugePanel = &bargauge
}
case "heatmap" :
var heatmap HeatmapPanel
p .OfType = HeatmapType
if err = json .Unmarshal (b , &heatmap ); err == nil {
p .HeatmapPanel = &heatmap
}
case "timeseries" :
var timeseries TimeseriesPanel
p .OfType = TimeseriesType
if err = json .Unmarshal (b , ×eries ); err == nil {
p .TimeseriesPanel = ×eries
}
case "logs" :
var logs LogsPanel
p .OfType = LogsType
if err = json .Unmarshal (b , &logs ); err == nil {
p .LogsPanel = &logs
}
case "gauge" :
var gauge GaugePanel
p .OfType = GaugeType
if err = json .Unmarshal (b , &gauge ); err == nil {
p .GaugePanel = &gauge
}
case "row" :
var rowpanel RowPanel
p .OfType = RowType
if err = json .Unmarshal (b , &rowpanel ); err == nil {
p .RowPanel = &rowpanel
}
default :
var custom = make (CustomPanel )
p .OfType = CustomType
if err = json .Unmarshal (b , &custom ); err == nil {
p .CustomPanel = &custom
}
}
if err != nil && (probe .Title != "" || probe .Type != "" ) {
err = fmt .Errorf ("%w (panel %q of type %q)" , err , probe .Title , probe .Type )
}
return err
}
func (p *Panel ) MarshalJSON () ([]byte , error ) {
switch p .OfType {
case GraphType :
var outGraph = struct {
CommonPanel
GraphPanel
}{p .CommonPanel , *p .GraphPanel }
return json .Marshal (outGraph )
case TableType :
var outTable = struct {
CommonPanel
TablePanel
}{p .CommonPanel , *p .TablePanel }
return json .Marshal (outTable )
case TextType :
var outText = struct {
CommonPanel
TextPanel
}{p .CommonPanel , *p .TextPanel }
return json .Marshal (outText )
case SinglestatType :
var outSinglestat = struct {
CommonPanel
SinglestatPanel
}{p .CommonPanel , *p .SinglestatPanel }
return json .Marshal (outSinglestat )
case StatType :
var outSinglestat = struct {
CommonPanel
StatPanel
}{p .CommonPanel , *p .StatPanel }
return json .Marshal (outSinglestat )
case DashlistType :
var outDashlist = struct {
CommonPanel
DashlistPanel
}{p .CommonPanel , *p .DashlistPanel }
return json .Marshal (outDashlist )
case BarGaugeType :
var outBarGauge = struct {
CommonPanel
BarGaugePanel
}{p .CommonPanel , *p .BarGaugePanel }
return json .Marshal (outBarGauge )
case PluginlistType :
var outPluginlist = struct {
CommonPanel
PluginlistPanel
}{p .CommonPanel , *p .PluginlistPanel }
return json .Marshal (outPluginlist )
case AlertlistType :
var outAlertlist = struct {
CommonPanel
AlertlistPanel
}{p .CommonPanel , *p .AlertlistPanel }
return json .Marshal (outAlertlist )
case RowType :
var outRow = struct {
CommonPanel
RowPanel
}{p .CommonPanel , *p .RowPanel }
return json .Marshal (outRow )
case HeatmapType :
var outHeatmap = struct {
CommonPanel
HeatmapPanel
}{p .CommonPanel , *p .HeatmapPanel }
return json .Marshal (outHeatmap )
case TimeseriesType :
var outTimeseries = struct {
CommonPanel
TimeseriesPanel
}{p .CommonPanel , *p .TimeseriesPanel }
return json .Marshal (outTimeseries )
case LogsType :
var outLogs = struct {
CommonPanel
LogsPanel
}{p .CommonPanel , *p .LogsPanel }
return json .Marshal (outLogs )
case GaugeType :
var outGauge = struct {
CommonPanel
GaugePanel
}{p .CommonPanel , *p .GaugePanel }
return json .Marshal (outGauge )
case CustomType :
var outCustom = customPanelOutput {
p .CommonPanel ,
*p .CustomPanel ,
}
return json .Marshal (outCustom )
}
return nil , errors .New ("can't marshal unknown panel type" )
}
type customPanelOutput struct {
CommonPanel
CustomPanel
}
func (c customPanelOutput ) MarshalJSON () ([]byte , error ) {
b , err := json .Marshal (c .CommonPanel )
if err != nil {
return b , err
}
buf := bytes .NewBuffer (b [:len (b )-1 ])
for k , v := range c .CustomPanel {
buf .WriteString (`,"` )
buf .WriteString (k )
buf .WriteString (`":` )
b , err := json .Marshal (v )
if err != nil {
return b , err
}
buf .Write (b )
}
buf .WriteString ("}" )
return buf .Bytes (), nil
}
func incRefID(refID string ) string {
firstLetter := refID [0 ]
ordinal := int (firstLetter )
ordinal ++
return string (rune (ordinal ))
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .